home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio / Ham Radio CD-ROM (Emerald Software) (1995).ISO / misc / hamutil1 / morse3.bas < prev    next >
BASIC Source File  |  1985-04-19  |  17KB  |  407 lines

  1. 10 CLS:KEY OFF
  2. 20 FALSE=0:TRUE=NOT FALSE
  3. 30 DEFINT I-L
  4. 40 '
  5. 50 '********** DEFINE ARRAYS **********
  6. 60 '
  7. 70 DIM B$(100)                  'B$ = LIST OF CHARACTERS TO BE GENERATED
  8. 80 DIM C$(100)                  'C$ = MORSE LOOKUP TABLE INDEX
  9. 90 DIM D$(100)                  'D$ = MORSE LOOKUP TABLE OUTPUT
  10. 100 DIM M$(10)                   'M$ = GROUP PASSED TO THE CODE GENERATOR
  11. 110 DIM IMAGE$(5)                'IMAGE$ = LAST 5 GROUPS SENT
  12. 120 '
  13. 130 '********** DEFINE MORSE CONVERSION TABLE **********
  14. 140 '           FIND THE CHARACTER YOU WANT IN C$ AND LOOK UP THE
  15. 150 '           CORRESPONDING DITTY DAHS AT THE SAME POSITION IN D$
  16. 160 '
  17. 170 C$ =      " -4VUAT :7BSIE ? ZD   ,  WM  .! K   *     $FRN  "
  18. 180 C$ = C$ +                                      CHR$ (34) + "/     ;#C    "
  19. 190 D$ =      " -....- ---... ..--.. --..-- .-.-.- .-... ...-. .-..-. -.-.-. "
  20. 200 C$ = C$ + " '9 G   ( Q    3     2JO   1     0     Y    X    P    L    "
  21. 210 D$ = D$ + " .----. -.--.- ...-- ..--- .---- ----- -.-- -..- .--. .-.. "
  22. 220 C$ = C$ + " @%      =     5H    6     8     "
  23. 230 D$ = D$ + " -...-.- -...- ..... -.... ---.. "
  24. 240 '
  25. 250 '********** DEFINE VARIABLES **********
  26. 260 '
  27. 270 'BD          NUMBER OF CHARS IN B$
  28. 280 'D1          CODE GEN DIT TIME
  29. 290 'D2          CODE GEN 1/3 CHARACTER SPACE TIME
  30. 300 'F1          SIDETONE PITCH, INITIALIZE TO 750 Hz
  31. 310 'LMIN        MINIMUM NUMBER OF CHARACTERS IN A GROUP
  32. 320 'LMAX        MAXIMUM NUMBER OF CHARACTERS IN A GROUP
  33. 330 'LPC         NUMBER OF GROUPS SENT TO THE PRINTER SINCE LAST C.R.
  34. 340 'LPF         PRINTER ON/OFF FLAG
  35. 350 'L1          LENGTH OF M$
  36. 360 'NEWTIME     CURRENT MINUTES FROM CLOCK
  37. 370 'OLDTIME     PREVIOUS MINUTES FROM CLOCK
  38. 380 'PASS        NUMBER OF MINUTES TO SEND BEFORE GOING TO NEXT SPEED
  39. 390 'P1          POSITION OF CURRENT CHARACTER IN C$
  40. 400 'S1          CHARACTER RATE - DEFINES DIT/DAH LENGTH
  41. 410 'S2          SPEED - DEFINES SPACING BETWEEN CHARACTERS
  42. 420 'S3          END SPEED - SPEED INCREASES TO THIS VALUE AND HOLDS
  43. 430 'TIMER       MINUTES COUNTER
  44. 440 '
  45. 450 '
  46. 460 '********** DEFINE INTERRUPT KEYS **********
  47. 470 '
  48. 480 ON KEY(1) GOSUB 1730        'F1 DECREASES RATE
  49. 490 ON KEY(2) GOSUB 1870        'F2 INCREASES RATE
  50. 500 ON KEY(11) GOSUB 1650       'UP INCREASES PITCH
  51. 510 ON KEY(14) GOSUB 1570       'DOWN DECREASES PITCH
  52. 520 ON KEY(13) GOSUB 2290       'RIGHT INCREASES SPEED
  53. 530 ON KEY(12) GOSUB 2180       'LEFT DECREASES SPEED
  54. 540 '
  55. 550 '********** JUMP TO MAIN **********
  56. 560 '
  57. 570 GOTO 2620
  58. 580 '
  59. 590 '                  *********************************
  60. 600 '                  ********** SUBROUTINES **********
  61. 610 '                  *********************************
  62. 620 '
  63. 630 '********** EI:   ENABLES INTERRUPT KEYS **********
  64. 640 '
  65. 650 KEY(1) ON
  66. 660 KEY(2) ON
  67. 670 KEY(11) ON
  68. 680 KEY(12) ON
  69. 690 KEY(13) ON
  70. 700 KEY(14) ON
  71. 710 RETURN
  72. 720 '
  73. 730 '*********** DI:   DISABLES INTERRUPT KEYS **********
  74. 740 '
  75. 750 KEY(1) OFF
  76. 760 KEY(2) OFF
  77. 770 KEY(11) OFF
  78. 780 KEY(12) OFF
  79. 790 KEY(13) OFF
  80. 800 KEY(14) OFF
  81. 810 RETURN
  82. 820 '
  83. 830 '***** CHARS:  BUILDS BUFFER OF CHARACTERS TO BE SENT
  84. 840 '
  85. 850 CLS
  86. 860 IF BD<>0 THEN 920
  87. 870 PRINT"Type in a list of characters to send in UPPER CASE ONLY please"
  88. 880 PRINT"   To send all characters, type ALL"
  89. 890 PRINT"   Use ; for comma"
  90. 900 PRINT"   Use = for double dash  (dah di di di dah)
  91. 910 PRINT: GOTO 1090
  92. 920 PRINT "The following characters are available for code practice:":PRINT
  93. 930 FOR I.CHARS = 0 TO BD-1
  94. 940     PRINT B$(I.CHARS)+" ";
  95. 950 NEXT I.CHARS
  96. 960 PRINT
  97. 970 PRINT:PRINT:PRINT
  98. 980 PRINT "Please enter:
  99. 990 PRINT"    Y to accept these characters
  100. 1000 PRINT"    A to add more to the list
  101. 1010 PRINT"    E to erase the list and start over
  102. 1020 PRINT:PRINT
  103. 1030 K$=INKEY$
  104. 1040 IF (K$="Y" OR K$="y") THEN CLS:RETURN       'EXIT FROM ROUTINE
  105. 1050 IF (K$="A" OR K$="a") GOTO 870
  106. 1060 IF (K$="E" OR K$="e") THEN BD=0:GOTO 830   'CLEARS BUFFER AND RESTARTS
  107. 1070 IF K$="" GOTO 1030
  108. 1080 GOTO 970   'INVALID RESPONSE
  109. 1090 'ADD CHARACTERS TO BUFFER
  110. 1100 INPUT;K$
  111. 1110 IF (K$="ALL" OR K$="all") GOTO 1200
  112. 1120 IF K$="" GOTO 830  'START OVER IF NONE ENTERED
  113. 1130 FOR J.CHARS = 1 TO LEN(K$)           'APPEND STRING TO B$
  114. 1140    CTMP$=MID$(K$,J.CHARS,1)        'ONE CHARACTER AT A TIME
  115. 1150    IF CTMP$=";" THEN CTMP$=CHR$(44)'CONVERT SEMICOLON TO COMMA
  116. 1160    B$(BD)=CTMP$
  117. 1170    BD=BD+1                         'POINT TO NEXT ENTRY IN B$
  118. 1180 NEXT J.CHARS
  119. 1190 GOTO 830                           'RE-DISPLAY CHARACTERS
  120. 1200 'LOAD B$ WITH ALL VALID CHARACTERS
  121. 1210 FOR L.CHARS = 65 TO 90
  122. 1220    B$(BD) = CHR$(L.CHARS)
  123. 1230    BD=BD+1
  124. 1240 NEXT L.CHARS
  125. 1250 FOR L.CHARS = 46 TO 57
  126. 1260    B$(BD) = CHR$(L.CHARS)
  127. 1270    BD=BD+1
  128. 1280 NEXT L.CHARS
  129. 1290 B$(BD)=CHR$(44):BD=BD+1            'LOADS COMMA
  130. 1300 B$(BD)="?":BD=BD+1
  131. 1310 B$(BD)="=":BD=BD+1                 'LOADS DOUBLE DASH
  132. 1320 GOTO 830                           'REDISPLAY AND ALLOW MORE
  133. 1330 '
  134. 1340 '***** CODEGEN:  MORSE GENERATOR, CHARACTERS PASSED IN M$
  135. 1350 '
  136. 1360 L1 = LEN (M$) : IF L1 = 0 GOTO 1530        'NULL INPUT IF 0
  137. 1370 FOR I1 = 1 TO L1
  138. 1380 W$ = MID$ (M$ , I1 , 1) : IF W$ = " " GOTO 1510    'WORD SPACE REQ'D
  139. 1390 P1 = INSTR (1 , C$ , W$)
  140. 1400 IF P1 = 0 GOTO 1510  : REM SEND WORD SPACE FOR UNKNOWN CHARACTERS
  141. 1410 SOUND 32000,3*D2 : REM  output character space
  142. 1420 W$ = MID$ (D$ , P1 , 1)
  143. 1430 IF W$ = " " GOTO 1520  : REM  jump if end of character
  144. 1440 IF W$ <> "." GOTO 1460
  145. 1450 SOUND F1,D1 : GOTO 1480  : REM  output dot
  146. 1460 IF W$ <> "-" GOTO 1500
  147. 1470 SOUND F1,3*D1 : REM  output dash
  148. 1480 P1 = P1 + 1
  149. 1490 IF MID$ (D$ , P1 , 1) = " " GOTO 1520
  150. 1500 SOUND 32000,D1 : GOTO 1420
  151. 1510 SOUND 32000,4*D2 : REM  word space
  152. 1520 NEXT I1
  153. 1530 RETURN
  154. 1540 '
  155. 1550 '
  156. 1560 '
  157. 1570 '***** PITCHDOWN:  INTERRUPT ROUTINE FOR THE CURSOR DOWN KEY. DECREASES
  158. 1580 '                  BY 10 Hz FOR EACH DEPRESSION. UPDATES STATUS LINE.
  159. 1590 '
  160. 1600 IF F1<=40 THEN RETURN       '40 Hz IS LOWER LIMIT
  161. 1610 F1=F1-10                    'PITCH DOWN BY 10 Hz
  162. 1620 GOSUB 2430                 'CALL STATUS
  163. 1630 RETURN
  164. 1640 '
  165. 1650 '***** PITCH UP:  INTERRUPT ROUTINE FOR THE CURSOR UP KEY. INCREASES
  166. 1660 '                 PITCH BY 10 Hz FOR EACH DEPRESSION. UPDATES STATUS.
  167. 1670 '
  168. 1680 IF F1>2000 THEN RETURN     '2000 Hz IS UPPER LIMIT
  169. 1690 F1=F1+10                   'PITCH UP
  170. 1700 GOSUB 2430                 'CALL STATUS
  171. 1710 RETURN
  172. 1720 '
  173. 1730 '***** RATE DOWN: INTERRUPT ROUTINE FOR THE F1 KEY. DECREASES THE RATE
  174. 1740 '                 BY 1 WPM FOR EACH DEPRESSION. IF THE RATE IS SET LESS
  175. 1750 '                 THAN THE CURRENT SPEED, SPEED WILL BE DECREASED ALSO.
  176. 1760 '
  177. 1770 'VARIABLES USED: S1 = RATE; S2 = SPEED; S3 = ENDING SPEED
  178. 1780 '
  179. 1790  IF S1<2 THEN RETURN                '2 WPM IS LOWER LIMIT
  180. 1800  S1=S1-1                            'DECREASE RATE BY 1 WPM
  181. 1810  IF S1<S3 THEN S3=S1                'DECREASE END SPEED IF > RATE
  182. 1820  IF S1<S2 THEN S2=S1                'DECREASE SPEED IF > RATE
  183. 1830  GOSUB 2430                         'CALL STATUS
  184. 1840  GOSUB 2560                         'CALL TWEAK
  185. 1850  RETURN
  186. 1860 '
  187. 1870 '***** RATE UP:   INTERRUPT ROUTINE FOR THE F2 KEY. INCREASES THE RATE
  188. 1880 '                 BY 1 WPM FOR EACH DEPRESSION.
  189. 1890 '
  190. 1900 'VARIABLES USED: S1 = RATE
  191. 1910 '
  192. 1920  IF S1>99 THEN RETURN               '99 WPM IS UPPER LIMIT
  193. 1930  S1=S1+1                            'INCREASE RATE BY 1 WPM
  194. 1940  GOSUB 2430                         'CALL STATUS
  195. 1950  GOSUB 2560                         'CALL TWEAK
  196. 1960  RETURN
  197. 1970 '
  198. 1980 '
  199. 1990 '***** SCROLL:  DISPLAYS LAST 5 GROUPS SENT
  200. 2000 '
  201. 2010 FOR N = 1 TO 4             'SCROLL IN MEMORY
  202. 2020    IMAGE$(N) = IMAGE$(N+1)
  203. 2030 NEXT N
  204. 2040 IMAGE$(5)=M$               'LOAD GROUP JUST SENT
  205. 2050 FOR N = 1 TO 5             'DISPLAY ON CRT
  206. 2060    LOCATE N,60
  207. 2070    PRINT IMAGE$(N)+"         "  'SPACE OVER ANYTHING ALREADY THERE
  208. 2080 NEXT N
  209. 2090 RETURN
  210. 2100 '
  211. 2110 '***** SEED:      SEEDS THE RANDOM NUMBER GENERATOR BASED ON TIME & DATE.
  212. 2120 '
  213. 2130  SEED=10000*VAL(RIGHT$(TIME$,2))+1000*VAL(MID$(TIME$,4,2))+100*VAL(LEFT$(TIME$,2))+10*VAL(LEFT$(DATE$,2))+VAL(MID$(DATE$,4,2))
  214. 2140  SEED=INT((SEED*.100592)-32767)
  215. 2150  RANDOMIZE SEED
  216. 2160  RETURN
  217. 2170 '
  218. 2180 '***** SPEED DOWN:  INTERRUPT ROUTINE FOR THE CURSOR LEFT KEY. DECREASES
  219. 2190 '                   SPPED BY 1 WPM.
  220. 2200 '
  221. 2210 'VARIABLES: S2 = SPEED
  222. 2220 '
  223. 2230 IF S2<=2 THEN RETURN       'LOWER LIMIT IS 2 WPM
  224. 2240 S2=S2-1                    'DECREASE SPEED BY 1 WPM
  225. 2250 GOSUB 2560                          'CALL TWEAK
  226. 2260 GOSUB 2430                 'CALL STATUS
  227. 2270 RETURN
  228. 2280 '
  229. 2290 '***** SPEED UP:  INTERRUPT ROUTINE FOR THE CURSOR RIGHT KEY. INCREASES
  230. 2300 '                 BY 1 WPM FOR EACH DEPRESSION. IF SPEED IS GREATER
  231. 2310 '                 THAN THE CURRENT RATE, RATE WILL BE INCREASED ALSO.
  232. 2320 '
  233. 2330 'VARIABLES USED: S1 = RATE; S2 = SPEED; S3 = ENDING SPEED
  234. 2340 '
  235. 2350  IF S2>59 THEN RETURN               '60 WPM IS UPPER LIMIT
  236. 2360  S2=S2+1                            'INCREASE SPEED BY 1 WPM
  237. 2370  IF S2>S3 THEN S3=S2                'INCREASE END SPEED IF < SPEED
  238. 2380  IF S2>S1 THEN S1=S2                'INCREASE RATE IF < SPEED
  239. 2390  GOSUB 2560                         'CALL TWEAK
  240. 2400  GOSUB 2430                         'CALL STATUS
  241. 2410  RETURN
  242. 2420 '
  243. 2430 '***** STATUS:   UPDATES STATUS LINE
  244. 2440 '
  245. 2450 X=POS(0):Y=CSRLIN                  'SAVE CURRENT CURSOR LOCATION
  246. 2460  LOCATE 25,1:PRINT "PITCH" F1;
  247. 2470  LOCATE 25,15:PRINT"RATE" S1;
  248. 2480  LOCATE 25,26:PRINT"SPEED" S2;
  249. 2490  LOCATE 25,37:PRINT "END SPEED" S3;
  250. 2500  LOCATE 25,59:PRINT "     ";:LOCATE 25,52:PRINT "TIMER" PASS;
  251. 2510 IF LPF=TRUE THEN LOCATE 25,65:PRINT "PRINTER ON ";
  252. 2520 IF LPF =FALSE THEN LOCATE 25,65:PRINT "PRINTER OFF";
  253. 2530  LOCATE Y,X                        'RESTORE CURSOR
  254. 2540 RETURN
  255. 2550 '
  256. 2560 '***** TWEAK:   CALCULATES DIT AND DAH TIMES BASED ON RATE AND SPEED
  257. 2570 '
  258. 2580 'VARIABLES: D1 = DIT TIME; D2 = 1/3 SPACE TIME; S1 = RATE; S2 = SPEED
  259. 2590 D1 = 1.2*18.2/S1 : D2 = (50*1.2*18.2/S2 - 31*D1) / 19
  260. 2600 RETURN
  261. 2610 '
  262. 2620 '********************************************************************
  263. 2630 '**                                                                **
  264. 2640 '**                  START OF MAIN PROGRAM                         **
  265. 2650 '**                                                                **
  266. 2660 '********************************************************************
  267. 2670 '
  268. 2680 CLS
  269. 2690 '
  270. 2700 LOCATE 10,20
  271. 2710 PRINT"Code Practice Oscillator  Version 1.0
  272. 2720 PRINT:LOCATE,25
  273. 2730 PRINT"by Tom Carrington N5FGN and Bill Lutts WB5LSR
  274. 2740 FOR DELAY=1 TO 2000:NEXT DELAY
  275. 2750 '
  276. 2760 FOR N = 1 TO 5                    'CLEAR THE DISPLAY BUFFER
  277. 2770   IMAGE$(N)=""
  278. 2780 NEXT N
  279. 2790 '
  280. 2800 GOSUB 2110                        'CALL SEED, GENERATES RANDOM NUMBER
  281. 2810 '
  282. 2820 GOSUB 730                         'CALL DI, DISABLE INTERRUPTS
  283. 2830 '
  284. 2840 GOSUB 830                         'CALL CHARS - BUILDS BUFFER OF
  285. 2850                                   'AVAILABLE CHARACTERS
  286. 2860 '
  287. 2870 'SET STARTING VALUES FOR PRINTER, PITCH, RATE, SPEED, ENDING SPEED,
  288. 2880 'TIME TO SPEND AT EACH SPEED, AND TYPE OF GROUPS TO SEND.
  289. 2890 '
  290. 2900 PRINT "Print while sending?   Y/N,   (Return = NO)"
  291. 2910 PK$=INKEY$:IF PK$="" GOTO 2910
  292. 2920 IF (PK$="y" OR PK$="Y") THEN LPF=TRUE ELSE LPF=FALSE
  293. 2930 CLS
  294. 2940 GOSUB 2430                        'CALL STATUS
  295. 2950 '
  296. 2960 INPUT "Sidetone pitch?   (Return = 750 Hz)   ",F1
  297. 2970 IF F1 = 0 THEN F1=750
  298. 2980 IF (F1<40 OR F1>2000) THEN PRINT"PITCH MUST BE BETWEEN 40 AND 2000 Hz":GOTO 2960
  299. 2990 CLS
  300. 3000 GOSUB 2430                        'CALL STATUS
  301. 3010 '
  302. 3020 PRINT "The character rate is the speed that each character will be sent."
  303. 3030 PRINT "The spacing between characters is set by the speed and is the"
  304. 3040 PRINT "actual words per minute to be sent":PRINT:PRINT
  305. 3050 INPUT "Character rate?   (Return = 20 WPM)   ",S1
  306. 3060 IF S1=0 THEN S1=20
  307. 3070 IF (S1<2 OR S1>60) THEN PRINT "Character rate must be between 2 and 60 WPM":GOTO 3050
  308. 3080 CLS
  309. 3090 GOSUB 2430                        'CALL STATUS
  310. 3100 '
  311. 3110 PRINT "The starting speed is the actual speed that code will be sent"
  312. 3120 PRINT:PRINT
  313. 3130 INPUT "Starting speed?   (Return = 5 WPM)   ",S2
  314. 3140 IF S2=0 THEN S2=5
  315. 3150 IF (S2<2 OR S2>60) THEN PRINT "Speed must be between 2 and 60 WPM":GOTO 3130
  316. 3160 IF S2>S1 THEN S1=S2               'MAKE RATE=SPEED IF SPEED>RATE
  317. 3170 CLS
  318. 3180 GOSUB 2430                        'CALL STATUS
  319. 3190 '
  320. 3200 PRINT "The ending speed is the highest speed that will be sent. Once it"
  321. 3210 PRINT "is reached, the speed will hold at this":PRINT:PRINT
  322. 3220 INPUT "Ending speed   (Return = 20 WPM)   ",S3
  323. 3230 IF S3=0 THEN S3=20
  324. 3240 IF (S3<2 OR S3>60) THEN PRINT "Ending speed must be between 2 and 60 WPM":GOTO 3220
  325. 3250 IF S3<S2 THEN S3=S2       'ENDSPEED MUST BE AT LEAST = START SPEED
  326. 3260 CLS
  327. 3270 GOSUB 2430                'CALL STATUS
  328. 3280 GOSUB 2560                'CALL TWEAK
  329. 3290 '
  330. 3300 PRINT "Now set the number of minutes to send before increasing the speed"
  331. 3310 PRINT:PRINT
  332. 3320 INPUT "Time in minutes?   (Return = 5 Minutes)   ",PASS
  333. 3330 IF PASS=0 THEN PASS=5
  334. 3340 IF (PASS<1 OR PASS>9999) THEN PRINT"Timer must be between 1 and 9999 Minutes":GOTO 3320
  335. 3350 CLS
  336. 3360 GOSUB 2430                'CALL STATUS
  337. 3370 '
  338. 3380 PRINT"You have a choice of fixed length or variable length groups":PRINT:PRINT
  339. 3390 INPUT"Fixed or Variable  F/V   (Return = 5 Character fixed length)   ",K$
  340. 3400 IF K$="F" GOTO 3450
  341. 3410 IF K$="V" GOTO 3520
  342. 3420  IF K$="" THEN LMIN=5:LMAX=5:GOTO 3610
  343. 3430 PRINT "Please type F, V OR Return":GOTO 3390
  344. 3440 '
  345. 3450 'FOR FIXED LENGTH GROUPS
  346. 3460 '
  347. 3470 INPUT"Number of characters in fixed length groups    (Return = 5)   ";LMIN
  348. 3480 IF LMIN=0 THEN LMIN=5
  349. 3490 IF LMIN>9 THEN PRINT"The length must be less than 10":GOTO 3470
  350. 3500 LMAX=LMIN: GOTO 3610
  351. 3510 '
  352. 3520 'FOR VARIABLE LENGTH GROUPS
  353. 3530 '
  354. 3540 INPUT"Minimum length of groups   (Return = 1)   ";LMIN
  355. 3550 IF LMIN=0 THEN LMIN=1
  356. 3560 IF LMIN>9 THEN PRINT "Minimum length must be less than 10":GOTO 3540
  357. 3570 INPUT"Maximum length of groups   (Return = 9)   ";LMAX
  358. 3580 IF LMAX=0 THEN LMAX=9
  359. 3590 IF LMAX>9 THEN PRINT"Maximum length must be less than 10":GOTO 3570
  360. 3600 IF LMIN>LMAX THEN SWAP LMIN,LMAX          'IF BACKWARDS, SWAP THEM
  361. 3610 CLS
  362. 3620 GOSUB 2430                        'CALL STATUS
  363. 3630 '
  364. 3640 ' DISPLAY MENU OF OPTIONS ON CRT
  365. 3650 '
  366. 3660 PRINT"Hit space bar to stop":PRINT:PRINT
  367. 3670 PRINT"F2     Increases Rate
  368. 3680 PRINT"F1     Decreases Rate":PRINT:PRINT
  369. 3690 PRINT CHR$(26) + "      Increases Speed
  370. 3700 PRINT CHR$(27) + "      Decreases Speed":PRINT:PRINT
  371. 3710 PRINT CHR$(24) + "      Increases Pitch"
  372. 3720 PRINT CHR$(25) + "      Decreases Pitch
  373. 3730 '
  374. 3740 ' START SENDING CODE
  375. 3750 '
  376. 3760 FOR N = 1 TO 5:LOCATE N,30:PRINT "                             ";:NEXT
  377. 3770 IF LPF=TRUE THEN LPRINT:LPRINT:LPRINT S1,S2:FOR DELAY=1 TO 2000:NEXT
  378. 3780 GOSUB 630                         'ENABLE INTERRUPT KEYS
  379. 3790 WHILE TIMER <= PASS
  380. 3800    FOR J=0 TO (LMIN+INT(RND*(LMAX-LMIN)))-1
  381. 3810        M$=M$+B$(INT(RND*(BD)))
  382. 3820    NEXT J
  383. 3830    M$=M$+" "
  384. 3840    GOSUB 1340         'CALL CODEGEN
  385. 3850    GOSUB 1990          'CALL SCROLL
  386. 3860    IF LPF=TRUE THEN LPRINT M$;:LPC=LPC+1
  387. 3870    IF(LPF=TRUE AND LPC=12) THEN LPRINT:LPC=0:FOR DELAY=1 TO 2000:NEXT '            PAUSE AFTER PRINTING TO ALLOW OPERATOR TO RECOVER FROM SURPRISE!
  388. 3880    M$=""
  389. 3890    K$=INKEY$
  390. 3900    IF K$<>" " GOTO 3960
  391. 3910    LOCATE 22,1:INPUT"Restart, Continue, or System";K$
  392. 3920    IF (K$="R" OR K$="r") THEN IF LPF=TRUE THEN LPRINT:GOTO 2620 ELSE GOTO 2620
  393. 3930    IF (K$="S" OR K$="s") THEN CLS:SYSTEM
  394. 3940    IF (K$="C" OR K$="c") THEN LOCATE CSRLIN-1,1:PRINT STRING$(50,32):GOTO 3960
  395. 3950    GOTO 3910
  396. 3960    NEWTIME=VAL(MID$(TIME$,4,2))
  397. 3970    IF NEWTIME=OLDTIME THEN 3980 ELSE OLDTIME=NEWTIME:TIMER=TIMER+1
  398. 3980 WEND                      'SEND CODE TILL TIME EXPIRES
  399. 3990 TIMER=1
  400. 4000 S2=S2+1
  401. 4010 IF S2>=S3 THEN S2=S3
  402. 4020 IF S2>=S1 THEN S1=S2
  403. 4030 GOSUB 2560                        'CALL TWEAK
  404. 4040 GOSUB 2430                        'CALL STATUS
  405. 4050 IF LPF=TRUE THEN LPRINT:LPRINT S1, S2:LPC=0:FOR DELAY= 1 TO 2000:NEXT '         PAUSE FOR OPERATOR RECOVERY FROM PRINTING
  406. 4060 GOTO 3780
  407.